home *** CD-ROM | disk | FTP | other *** search
/ The Fatted Calf / The Fatted Calf.iso / Applications / Communication / Weather / Source / util.c < prev    next >
C/C++ Source or Header  |  1993-11-13  |  5KB  |  227 lines

  1. /*
  2.  * A potpourri of handy little utilities.
  3.  *
  4.  * Michael Hawley
  5.  * MIT Media Laboratory
  6.  * 20 Ames St
  7.  * Cambridge, MA 02139
  8.  * mike@media-lab.mit.edu
  9.  * Copyright (c) MIT Media Laboratory 1991
  10.  */
  11.  
  12. #include <sys/stat.h>
  13. #include <libc.h>
  14. #include <sys/stat.h>
  15. #include <regex.h>
  16. #include "util.h"
  17. #include "state.h"
  18.  
  19. char *av0 = "Weather.app";
  20.  
  21. void error(char *fmt, ...) {
  22.     va_list ap;
  23.     va_start(ap, fmt);
  24.     vprintf(fmt, ap), printf("\n");
  25.     va_end(ap);
  26. }
  27.  
  28. int Verbose=0;  /* make it 1 to send copious diganostics to the console */
  29.  
  30. void debug(char *fmt, ...) { /* printf an error msg */
  31.     va_list ap;
  32.     va_start(ap, fmt);
  33.     if (Verbose) {
  34.         vprintf(fmt, ap), printf("\n");
  35.     }
  36.     va_end(ap);
  37. }
  38.  
  39. int System(char *fmt, ...)
  40. {
  41.     va_list  ap;
  42.     int i=0;
  43.     char t[2048];
  44.     
  45.     va_start(ap, fmt);
  46.     vsprintf(t, fmt, ap);
  47.     debug("!%s",t);
  48.     if (i = system(t)) error("%s: failed! %s",av0,t);
  49.     va_end(ap);
  50.     return !i;
  51. }
  52.  
  53. char *save(char *s) { /* save a copy of 's' and return the pointer */
  54.     char *t = (char *)malloc(strlen(s)+1);
  55.     if (t) strcpy(t,s);
  56.     return t;
  57. }
  58.  
  59. int blank(char *s) { /* true if 's' is blank */
  60.     while (*s == ' ' || *s=='\t' || *s == '\n') ++s;
  61.     return !*s;
  62. }
  63.  
  64. void stripcomment(char *s) { /* truncate 's' at a comment character ('#') */
  65.     char *p = index(s,'#');
  66.     if (p && (p==s || p[-1] != '\\')) *p = '\0';
  67. }
  68.  
  69. void stripnl(char *s) { /* remove trailing \n and space from 's' */
  70.     char *p = s + strlen(s)-1;
  71.     while (p>s && (*p=='\n' || *p == ' ')) *p-- = '\0';
  72. }
  73.  
  74. char *skipsp(char *s) {
  75.     while (*s==' ' || *s=='\t' || *s == '\n') ++s;
  76.     return s;
  77. }
  78.  
  79. void squishblank(char *s) {
  80.     char *t=s;
  81.     while (*t = *s){
  82.         if (t>s && (*t==' ' || *t=='\t') && (t[-1]==' '||t[-1]=='\t'))
  83.             ++s;
  84.         else
  85.             ++t, ++s;
  86.     }
  87. }
  88.  
  89. void squishwhite(char *s) {
  90.     char *t=s;
  91.     while (*t = *s){
  92.         if (t>s && (*t==' ' || *t=='\t' || *t=='\n') && 
  93.                    (t[-1]==' '||t[-1]=='\t'||t[-1]=='\n'))
  94.             ++s;
  95.         else
  96.             ++t, ++s;
  97.     }
  98. }
  99.  
  100. char *
  101. prefix(char *s, char *t) { /* true if 't' is a prefix of 's' */
  102.     int sl = strlen(s);
  103.     t = skipsp(t);
  104.     return (*t == *s && strncmp(s,t,sl)==0)? skipsp(t+sl) : (char *)0;
  105. }
  106.  
  107. int suffix(char *s, char *t) { /* true if 't' is a suffix of 's' */
  108.     s = rindex(s,'.');
  109.     return s? strcmp(s,t)==0 : 0;
  110. }
  111.  
  112. char *
  113. strindex(char *s, char *t) { /* return ptr to first match of 't' in 's' */
  114.     int n = strlen(t);
  115.  
  116.     if (s)
  117.         while (*s)
  118.             if (!strncmp(s, t, n))
  119.                 return s;
  120.             else
  121.                 s++;
  122.     return (char *)0;
  123. }
  124.  
  125. void sub(char *s, char a, char b) { /* in 's', s/a/b/g */
  126.     while (*s){
  127.         if (*s==a) *s=b;
  128.         s++;
  129.     }
  130. }
  131.  
  132. void substr(char *s, char *a, char *b) { /* like 'sub', but with strings */
  133.     char q[8192];
  134.     char *p = s;
  135.     int n = strlen(a);
  136.     for (;*p;p++){
  137.         if (*p == *a && strncmp(p,a,n)==0){
  138.             strcpy(q,p+n);
  139.             strcpy(p,b);
  140.             strcpy(p+strlen(b),q);
  141.             p += strlen(b)-1;
  142.         }
  143.     }
  144. }
  145.  
  146. void stot(char *s, char **t, char c) /* split 's' into a table 't' */
  147. {
  148.     char *p;
  149.     while (p = index(s,c)){
  150.         *p++ = '\0';
  151.         *t++ = s;
  152.         s = p;
  153.     }
  154.     *t++ = s;
  155.     *t = (char *)0;
  156. }
  157.  
  158.  
  159. int fMode(char *f) { /* return mode bits */
  160.     struct stat b;
  161.     return stat(f,&b)? 0 : b.st_mode;
  162. }
  163.  
  164. int fSize(char *f) { /* return mode bits */
  165.     struct stat b;
  166.     return stat(f,&b)? 0 : b.st_size;
  167. }
  168.  
  169. int fTime(char *f) { /* mod time of file 'f' */
  170.     struct stat b;
  171.     return stat(f,&b)? 0 : b.st_mtime;
  172. }
  173.  
  174. int fDirectory(char *f) { /* true if file 'f' is a directory */
  175.     struct stat b;
  176.     return stat(f,&b)? 0 : ((b.st_mode & S_IFDIR) == S_IFDIR);
  177. }
  178.  
  179. int fLink(char *f) { /* true if file 'f' is a symbolic link */
  180.     struct stat b;
  181.     return lstat(f,&b)? 0 : ((b.st_mode & S_IFLNK) == S_IFLNK);
  182. }
  183.  
  184. int 
  185. mkdirs(char *s, int mode) { /* ensure that all the directories in 's' exist */
  186.     char t[4096], *p = t;
  187.  
  188.     strcpy(t,s);
  189.     if (*p=='/') ++p;
  190.     while (p = index(p,'/')) {
  191.     *p = '\0';
  192.         if (access(t,0)){
  193.             if (mkdir(t,mode))
  194.                 return 0;
  195.         /* fixmod(t); */
  196.     }
  197.         *p++ = '/';
  198.     }
  199.     if (access(t,0) && mkdir(t,mode)) return 0;
  200.     /* fixmod(t); */
  201.     debug("mkdir %s",t);
  202.     return 1;
  203. }
  204.  
  205.  
  206.  
  207. int match(char *s, char *expr)
  208. /*
  209.  * true if 's' matches regular expression 'expr'
  210.  * (a simple regex, grep-style, *not* egrep)
  211.  */
  212. {
  213.     static char p[256]="", *q=(char *)0;
  214.     static struct regex *r = (struct regex *)0;
  215.     if (q != expr){
  216.         if (strcmp(p,expr)){
  217.             if (r) free(r);
  218.             if (r=re_compile(expr,0))
  219.                 ;
  220.             else return 0;
  221.             strcpy(p,expr);
  222.         }
  223.         q = expr;
  224.     }
  225.     return r? re_match(s,r)==1 : 0;
  226. }
  227.